package com.gxa.clientorder.service.impl;

import com.gxa.clientorder.exception.BusinessException;
import com.gxa.clientorder.mapper.OrderMapper;
import com.gxa.clientorder.mapper.SendoutMapper;
import com.gxa.clientorder.pojo.Order;
import com.gxa.clientorder.pojo.Sendout;
import com.gxa.clientorder.service.OrderService;
import com.gxa.clientorder.utils.CreateNumber;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @Author FanJiang
 * @Date 2020/11/12
 * @Version 1.0
 */
@Service("orderService")
public class OrderServiceImpl implements OrderService {

    @Resource
    OrderMapper orderMapper;
    @Resource
    SendoutMapper sendoutMapper;

    /**
     * 订单列表接口的service
     *
     * @param ordnum  订单号
     * @param addname 收货姓名
     * @param state   订单状态
     * @return
     */
    @Override
    public List orderList(String ordnum, String addname, Integer state) {
        return orderMapper.orderList(ordnum,addname,state);
    }

    /**
     * 根据团购编号查询团购参团订单
     *
     * @param gronum
     * @return 团购编号所在团的所有参团订单list
     */
    @Override
    public List findBygronum(String gronum) {
        Order order = new Order();
        order.setGronum(gronum);
        return orderMapper.select(order);
    }

    /**
     * 开团插入
     *
     * @param sysnum   商品编号
     * @param username 购买用户昵称
     * @param buytime  下单时间
     * @param sendtype 配送方式
     * @param meg      用户下单备注
     * @return int
     */
    @Override
    public String opengro(String sysnum, String gronum,Integer userid,
                          String username, Date buytime, Integer sendtype, Double money,String meg) {
        Order order = new Order();
        String ordnum = CreateNumber.getNum();
        order.setOrdnum(ordnum);
        order.setSysnum(sysnum);
        order.setGronum(gronum);
        order.setUserid(userid);
        order.setMoney(money);
        //设置下单时间，保持和拼团时间一致，所以采用传参方式
        order.setPaytime(buytime);
        order.setMessage(meg);
        //设置购买用户
        order.setUsername(username);
        //1、快递配送，2、门店自提
        order.setSendtype(sendtype);
        //设置订单综合状态  0/待付款、1/待发货、
        order.setZstate(0);
        //设置支付状态  0/未支付、1/已支付、2/已退款
        order.setPaystate(0);
        //设置团购状态 0/助力失败、1/助力中、2/已成团待抽奖、
        order.setGrostate(1);
        //设置订单类型
        // 1/团购、2/秒杀、3/抽奖、
        //4/助力、5/普通订单
        order.setOrdtype(1);
        int i = orderMapper.insertSelective(order);
        if (i == 0) {
            throw new BusinessException("开团失败，失败原因：订单创建失败");
        }
        return ordnum;
    }

    /**
     * 参团插入
     *
     * @param sysnum   商品编号
     * @param gronum   拼团编号
     * @param username 购买用户昵称
     * @param sendtype 配送方式
     * @param meg      用户下单备注
     * @return int
     */
    @Override
    public String joingro(String sysnum, String gronum,Integer userid, String username,
                          Integer sendtype,Double money, String meg) {
        Order order = new Order();
        String ordnum = CreateNumber.getNum();
        order.setOrdnum(ordnum);
        order.setSysnum(sysnum);
        order.setGronum(gronum);
        order.setUserid(userid);
        order.setMoney(money);
        //设置下单时间
        order.setBuytime(new Date());
        order.setMessage(meg);
        //设置购买用户
        order.setUsername(username);
        //1、快递配送，2、门店自提
        order.setSendtype(sendtype);
        //设置订单综合状态  0/待付款、1/待发货、
        order.setZstate(0);
        //设置支付状态  0/未支付、1/已支付、2/已退款
        order.setPaystate(0);
        //设置团购状态 0/助力失败、1/助力中、2/已成团待抽奖、
        order.setGrostate(1);
        //设置订单类型
        // 1/团购、2/秒杀、3/抽奖、
        //4/助力、5/普通订单
        order.setOrdtype(1);
        int i = orderMapper.insertSelective(order);
        if (i == 0) {
            throw new BusinessException("开团失败，失败原因：订单创建失败");
        }
        return ordnum;
    }

    /**
     * 更新订单支付状态
     *
     * @param ordnum   唯一识别号ordnum
     * @param paystate 支付状态0未支付，1已支付,3/已取消
     * @return
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.DEFAULT,rollbackFor = {Throwable.class})
    public Integer updatePay(String ordnum, Integer paystate) {
        Order order = new Order();
        order.setOrdnum(ordnum);
        //根据ordnum查询到一条order的数据
        order = orderMapper.selectOne(order);
        order.setPaytime(new Date());
        //判断支付状态为已支付
        if (paystate == 1) {
            order.setPaystate(1);
            order.setZstate(1);
            order.setGrostate(1);
            //支付成功，将订单写入发货表
            Sendout sendout = new Sendout();
            sendout.setOrdnum(ordnum);
            sendout.setOutnum(CreateNumber.getNum());
            //1/已发货、2/正常、未发货
            sendout.setSenstate(2);
            sendoutMapper.insertSelective(sendout);
        }
        //判断支付状态为未支付
        if (paystate == 0) {
            order.setPaystate(0);
            order.setZstate(0);
            order.setGrostate(null);
        }
        //判断支付状态为取消订单
        if (paystate == 3) {
            order.setPaystate(3);
            order.setZstate(6);
            order.setGrostate(9);
        }
        return orderMapper.updateByPrimaryKeySelective(order);
    }

    /**
     * 写入订单
     * @param order
     * @return 订单号
     */
    @Override
    public String insert(Order order) {
        String ordnum = CreateNumber.getNum();
        order.setOrdnum(ordnum);
        order.setBuytime(new Date());
        int i = orderMapper.insertSelective(order);
        if (i == 0) {
            throw new BusinessException("下单失败，失败原因：订单创建失败");
        }
        return ordnum;
    }

    /**
     * 我的订单页面数据接口
     * @param order order对象
     * @return list
     */
    @Override
    public List findByuserid(Order order) {

        return orderMapper.select(order);
    }

    /**
     * 根据订单号查询订单详情
     * @param ordnum
     * @return order对象
     */
    @Override
    public Order findByOrdnum(String ordnum) {
        Order order = new Order();
        order.setOrdnum(ordnum);
        return orderMapper.selectOne(order);
    }

    @Override
    public Integer userOrd(String ordnum) {
        Order order = new Order();
        order.setZstate(5);
        Example example = new Example(Order.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.orLike("ordnum",ordnum);
        return orderMapper.updateByExampleSelective(order,example);
    }


}
